<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>01_变量</title>
</head>
<body>
  <script>
    /* 
    变量到底是什么?
      可以变化的量(数据)
      由变量名和变量值(数据), 用来读写这个数据
      一个变量对应一块小内存, 数据保存在内存中, 变量名是内存标识
    基本类型变量与引用类型变量的区别是什么?
      前置认识: 一块小内存, 有2个方面的数据, 一个是内存中保存的数据, 另一个是内存的地址值
      一个保存的是基本类型数据 / 地址值数据
    给变量赋值到底做了什么?
      将右侧变量内存中的数据拷贝一份, 保存到左侧变量内存中
    函数传参, 到底是值传递还是引用传递? 
      实参是基本变量, 将实参变量内存的基本数据传递给形参变量 => 值传递
      实参是引用变量, 将实参变量内存的地址值数据传递给形参变量 => 值传递/引用传递
    有哪些改变变量值的方式?
      给变量重新赋值
      a.m = 3 => 没有改变c变量内存数据, 改变是c指向的对象内部的属性数据
    如何理解下面2句重要的话(编码演示说明)?
      2个引用变量指向同一个对象, 如果通过一个变量修改对象内部的数据 => 另一个变量也能看到原对象(新数据)
      2个引用变量指向同一个对象, 让其中一个变量指向一个新的对象 => 另一个引用变量看到的是老的对象
    */

    // var a1 = 2
    // var a2 = {m: 1}
    // var a3 = a1 // 将a1内存中保存的数据(基本类型), 拷贝一份保存到a3内存中
    // var a4 = a2 // 将a2内存中保存的数据(引用类型/地址值), 拷贝一份保存到a4内存中

    function fn(x) {
      
    }
    var a = 2
    fn(a)  // x = a  => 值传递
    var b = {m: 2}
    fn(b) // x = b  // 值传递 => 传递的就是b变量内存中保存的数据
      // 引用传递 => b内存中保存的数据是引用类型(地址值)
    
    var c = 3
    c = {m: 2}
    c.m = 3 // 没有改变c变量内存数据, 改变是c指向的对象内部的属性数据

    /* 
    如何理解下面2句重要的话(编码演示说明)?
      2个引用变量指向同一个对象, 如果通过一个变量修改对象内部的数据 => 另一个变量也能看到原对象(新数据)
      2个引用变量指向同一个对象, 让其中一个变量指向一个新的对象 => 另一个引用变量看到的是老的对象
    */
    var d1 = {m: 1}
    var d2 = d1

    // d1.m = 2
    // console.log(d2.m) // 2

    // d1 = {m: 2}
    // console.log(d2.m) // 1

    function fn(x) {
      // x = {m: 2}
      x.m = 3
    }
    var x = {m: 1}
    var y = x
    fn(x)
    console.log(x.m, y.m) // 






  </script>
</body>
</html>